#
# Realise par Nicolas Berrez
#
from Matrice import Matrice
from Error import Error

class SnakeWord :    
    
    def __init__(self, l, c, userCreateur, maxNbJoueur, gameId, dico, gameName, privacy):
        self.matrix = Matrice(l, c)
        self.userCreateur = userCreateur
        self.playerList = list()
        # self.playerList.append(userCreateur)
        self.dico = dico
        firstWord = dico.getRandom(c)
        self.matrix.setMot(firstWord)
        self.maxNbJoueur = maxNbJoueur
        self.error = Error()
        self.currentUserIndex = 0
        self.gameId = gameId
        self.gameName = gameName
        self.nbPasser = 0
        self.scores = list()
        self.isPrivate = privacy
        self.wordEntered = set()
        self.wordEntered.add(firstWord)
        
    '''
    ajoute un nouveau joueur a la liste
    '''
    def addPlayeur (self, user):
        if not self.isComplete() :
            self.playerList.append(user)
            return len(self.playerList) - 1
    
    '''
    passe du joueur courant au joueur suivant
    '''
    def nextUser(self):
        self.currentUserIndex = (self.currentUserIndex + 1) % len(self.playerList)
    
    def isFinished(self):
        return self.matrix.isFull()
    
    '''
    coup joue par le joueur. Traite les different cas d'erreur
    '''
    def addWord(self, ligne, col, letter, word):
        l=int(ligne)
        c=int(col)
        if word in self.wordEntered :
            #si le mot a deja ete joue
            return self.error.getErrorMessage(66)
        if letter == "" or word=="" :
            #si le mot ne ou la lettre sont vide
            return self.error.getErrorMessage(51)
        if not self.dico.find(word):
            #les mot n'est pas dans le dico
            return self.error.getErrorMessage(404)
        else:
            #mot elligible
            if self.matrix.insert(ligne, col, letter):
                if self.matrix.findWord(ligne, col, word) :
                    #mot faisable dans la grille
                    self.playerList[self.currentUserIndex].score += len(word)
                    self.nextUser()
                    self.wordEntered.add(word)
                    return True
                else :
                    self.matrix.mat[l][c] ="null"
                    #mot non faisable dans la grille
                    return  self.error.getErrorMessage(51)
            else : 
                self.matrix.mat[l][c] ="null"
                #la case n'est pas vide
                return self.error.getErrorMessage(42)

    #le nombre maximal de joueur est atteint
    def isComplete(self):
        return len(self.playerList) == self.maxNbJoueur
    
    #retourne le joueur qui a le plus de point
    def getWinner(self):
        winner = 0
        for i in range(0, len(self.playerList)):
            if self.playerList[i].score > self.playerList[winner].score:
                winner = i
        return winner
